package bankowosc.polaczenie;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

import bankowosc.dane.Lokata;
import bankowosc.dane.Rodzaj_lokaty;

public class LokataStatements {
	public ArrayList<Lokata> selectAllLokata(polacz p) {
		ArrayList<Lokata> lokata = new ArrayList<Lokata>();
		Statement stmt = p.getStmt();
		String komenda = "select * from Lokata";
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try {
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				lokata.add(new Lokata(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getInt(4), rs.getInt(5),
						sdf.format(rs.getDate(6)), sdf.format(rs.getDate(7)), rs.getString(8), rs.getDouble(9), rs.getString(10), rs.getString(11), rs.getString(12)));
			}
			rs.close();
			return lokata;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public ArrayList<Rodzaj_lokaty> selectAllRodzajLokaty(polacz p){
		ArrayList<Rodzaj_lokaty> rodzajLokaty = new ArrayList<Rodzaj_lokaty>();
		Statement stmt = p.getStmt();
		String komenda = "select * from Rodzaj_Lokaty";
		try {
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				rodzajLokaty.add(new Rodzaj_lokaty(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getDouble(4), rs.getDouble(5),
						rs.getString(6), rs.getDouble(7), rs.getDouble(8), rs.getInt(9), rs.getInt(10), rs.getString(11)));
			}
			rs.close();
			return rodzajLokaty;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public String selectWaluta(polacz p, int idWaluty){
		String waluta = "";
		Statement stmt = p.getStmt();
		String komenda = "select skrot_waluty from waluta where id_waluty = " + idWaluty;
		try {
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				waluta = rs.getString(1);
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return waluta;
	}
	
	public int getMaxLokataId(polacz p){
		int id = 0;
		Statement stmt = p.getStmt();
		String komenda = "select max(nr_Lokaty) from lokata";
		try {
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				id = rs.getInt(1);
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		id++;
		return id;
	}
	
	public boolean dodajLokate(polacz p, int idLokaty, int idZm, int idRodzaju, int idKlienta, Calendar dataRozpoczecia, Calendar dataZakonczenia, Double kwota, BigDecimal rachunek, String nazwa, String odnowiona){
		Connection c = p.getC();
		try{
			Random rand = new Random();
			BigInteger big = new BigInteger(86, rand);
			BigDecimal bigDec = new BigDecimal(big);
			
			CallableStatement ctmt = c.prepareCall("call dodaj_lokate(?,?,?,?,?,?,?,?,?,?,?)");
			ctmt.setInt(1,idLokaty);	
			ctmt.setBigDecimal(2, bigDec);
			ctmt.setNull(3, java.sql.Types.INTEGER);
			ctmt.setInt(4, idRodzaju);
			ctmt.setInt(5, idKlienta);
			ctmt.setDate(6, new java.sql.Date(dataRozpoczecia.getTimeInMillis()));
			ctmt.setDate(7, new java.sql.Date(dataZakonczenia.getTimeInMillis()));
			ctmt.setString(8,"N");
			ctmt.setDouble(9, kwota);
			ctmt.setBigDecimal(10, rachunek);
			ctmt.setString(11, nazwa);
			ctmt.execute();
			return true;
		}
		catch(SQLException e){
			e.printStackTrace();
		}
		return false;
	}
	
	public void dodajPrzelew(polacz p, BigDecimal id_rachunek, Double kwota, int id_waluta){
		Connection c = p.getC();
		try{
			
			CallableStatement ctmt = c.prepareCall("call dodaj_przelew(?,?,?)");
			ctmt.setBigDecimal(1,id_rachunek);	
			ctmt.setDouble(2, kwota);
			ctmt.setInt(3, id_waluta);
			ctmt.execute();
		}
		catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public Rodzaj_lokaty getRodzajLokatyForId(polacz p, int id){
		Statement stmt = p.getStmt();
		String komenda = "select * from Rodzaj_Lokaty where id_rodzaju_lokaty=" + id;
		try {
			Rodzaj_lokaty rodzajLokaty = null;
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				rodzajLokaty = new Rodzaj_lokaty(rs.getInt(1), rs.getInt(2), rs.getString(3), rs.getDouble(4), rs.getDouble(5),
						rs.getString(6), rs.getDouble(7), rs.getDouble(8), rs.getInt(9), rs.getInt(10), rs.getString(11));
			}
			rs.close();
			return rodzajLokaty;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void zmienStatusLokaty(polacz p, BigDecimal idLokaty){
		Connection c = p.getC();
		try{			
			CallableStatement ctmt = c.prepareCall("call zmien_status(?)");
			ctmt.setBigDecimal(1,idLokaty);		
			ctmt.execute();
		}
		catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public ArrayList<Lokata> selectAllLokataForIdKlient(polacz p, int idKlienta) {
		ArrayList<Lokata> lokata = new ArrayList<Lokata>();
		Statement stmt = p.getStmt();
		String komenda = "select * from Lokata where id_klienta=" + idKlienta;
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		try {
			ResultSet rs = stmt.executeQuery(komenda);
			while(rs.next()) {
				lokata.add(new Lokata(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getInt(4), rs.getInt(5),
						sdf.format(rs.getDate(6)), sdf.format(rs.getDate(7)), rs.getString(8), rs.getDouble(9), rs.getString(10), rs.getString(11), rs.getString(12)));
			}
			rs.close();
			return lokata;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}
